package hr.fer.zpr.nmbp.project1.bll;

import hr.fer.zpr.nmbp.project1.bll.exceptions.BLLException;
import hr.fer.zpr.nmbp.project1.dao.DAOFactory;
import hr.fer.zpr.nmbp.project1.dao.PacijentDAO;
import hr.fer.zpr.nmbp.project1.dao.exceptions.DAOException;
import hr.fer.zpr.nmbp.project1.model.Dijagnoza;
import hr.fer.zpr.nmbp.project1.model.Karton;
import hr.fer.zpr.nmbp.project1.model.Pacijent;
import java.util.List;

public class PacijentBLL {

	private PacijentDAO pacijentDAO = DAOFactory.getPacijentDAO();
	
    public void save(Pacijent pacijent) {
    	if (!isValidPacijent(pacijent)) {
    		throw new BLLException("Sva polja moraju biti popunjena");
    	}
    	
    	if(pacijent.getKarton().getPacijent() == null){
    		pacijent.getKarton().setPacijent(pacijent);
    	}
    	
    	if(pacijent.getLijecnik() != null && 
    			!pacijent.getLijecnik().getPacijenti().contains(pacijent)){
    		pacijent.getLijecnik().getPacijenti().add(pacijent);
    	}
    	
    	try{
    		pacijentDAO.save(pacijent);
    	}catch (DAOException e) {
    		
    		if(pacijent.getLijecnik() != null && 
        			pacijent.getLijecnik().getPacijenti().contains(pacijent)){
        		pacijent.getLijecnik().getPacijenti().remove(pacijent);
        	}
    		
			throw new BLLException(e.getMessage());
		}
    }        
    
    public void update(Pacijent pacijent){
    	if (!isValidPacijent(pacijent)) {
    		throw new BLLException("Sva polja moraju biti popunjena");
    	}
    	
    	Pacijent proto = new Pacijent();
    	proto.setMbo(pacijent.getMbo());
    	List<Pacijent> pacijentiFromDB = this.pacijentDAO.load(proto);
    	
    	Pacijent persistentPacijent;
    	if(pacijentiFromDB.size() > 0){
    		persistentPacijent = pacijentiFromDB.get(0);
    		persistentPacijent.setIme(pacijent.getIme());
    		persistentPacijent.setPrezime(pacijent.getPrezime());
    		persistentPacijent.setLijecnik(pacijent.getLijecnik());
    		
    		Karton persistentKarton = persistentPacijent.getKarton();
    		Karton newKarton = pacijent.getKarton();
    		persistentKarton.setDatumRodenja(newKarton.getDatumRodenja());
    		persistentKarton.setKilaza(newKarton.getKilaza());
    		persistentKarton.setKrvnaGrupa(newKarton.getKrvnaGrupa());
    		persistentKarton.setNapomena(newKarton.getNapomena());
    		persistentKarton.setSpol(newKarton.getSpol());
    		persistentKarton.setPacijent(persistentPacijent);
    		
    		List<Dijagnoza> persistentDijagnoze = persistentKarton.getDijagnoze();
    		persistentDijagnoze.clear();
    		for(Dijagnoza dijagnoza : newKarton.getDijagnoze()){
    			persistentDijagnoze.add(dijagnoza);
    		}
    		
    		if(persistentPacijent.getLijecnik() != null && 
    				!persistentPacijent.getLijecnik().getPacijenti().contains(persistentPacijent)){
    			persistentPacijent.getLijecnik().getPacijenti().add(persistentPacijent);
        	}
    	}else{
    		throw new BLLException("Nepostojeći pacijent u bazi podataka");
    	}
    	
    	try{
    		pacijentDAO.save(persistentPacijent);
    	}catch (DAOException e) {
    		
    		if(persistentPacijent.getLijecnik() != null && 
    				persistentPacijent.getLijecnik().getPacijenti().contains(persistentPacijent)){
    			persistentPacijent.getLijecnik().getPacijenti().remove(persistentPacijent);
        	}
    		
			throw new BLLException(e.getMessage());
		}
    }
    
    public List<Pacijent> loadAll() {
        return pacijentDAO.loadAll();
    }
    
    public void delete(Pacijent pacijent){
    	this.pacijentDAO.delete(pacijent);
    }

    public static boolean isValidPacijent(Pacijent pacijent) {
    	if(pacijent.getIme() == null
    			|| pacijent.getIme().isEmpty()
    			|| pacijent.getPrezime() == null
    			|| pacijent.getPrezime().isEmpty()
    			|| pacijent.getMbo() == null
    			|| pacijent.getMbo().isEmpty()){
    		return false;
	    }else{
	    	return true;
	    }
    }
}
